package cl.ncx.cmvrc.persistence.bean.solicitudes;

import java.util.List;

import javax.ejb.EJB;
import javax.ejb.EJBException;
import javax.ejb.Local;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

import org.jboss.logging.Logger;

import cl.ncx.cmvrc.persistence.base.entities.personas.Autoridad;
import cl.ncx.cmvrc.persistence.base.entities.personas.Persona;
import cl.ncx.cmvrc.persistence.base.entities.solicitud.EstadoSolicitud;
import cl.ncx.cmvrc.persistence.base.entities.solicitud.Solicitud;
import cl.ncx.cmvrc.persistence.bean.autoridad.AutoridadSessionRemote;

@Stateless(mappedName=ISolicitudesSession.JNDI_NAME)
@Local({SolicitudesSessionLocal.class})
@Remote({SolicitudesSessionRemote.class})

public class SolicitudesSessionBean implements  SolicitudesSessionLocal, SolicitudesSessionRemote {

	@PersistenceContext(unitName="cmvrcPU")
	@EJB AutoridadSessionRemote autoridadRemote;
	
	private EntityManager entityManager;
	
	private final static Logger logger = Logger.getLogger(SolicitudesSessionBean.class);
	
	public Solicitud ingresoNuevaSolicitud(Solicitud solicitud) throws EJBException{
		try{
			 EstadoSolicitud estadoSolicitud = entityManager.find(EstadoSolicitud.class, new Integer(1));
			 
			 //Validamos que si es un nuevo ingreso de autoridad o uno existente
			 Autoridad autoridad = autoridadRemote.verificaSiExisteAutoridad(solicitud.getAutoridad());
			 if(autoridad!=null) //si existe seteamos la autoridad.
			 {
				 solicitud.setAutoridad(autoridad);
			 }
		
			 solicitud.setEstadoSolicitud(estadoSolicitud);
			 entityManager.persist(solicitud);
			 return solicitud;
		}catch (Exception e) {
			e.printStackTrace();
			logger.info("");
			throw new EJBException(e);
		}
	}
	
	public void modificaSolicitud(Solicitud solicitud) throws EJBException{
		
		try{			
			entityManager.merge(solicitud);
			
		}catch (Exception e) {
			e.printStackTrace();
			throw new EJBException(e);
		}
	}
	
	public void anulaSolicitud(Solicitud solicitud) throws EJBException{
		
		try{
			EstadoSolicitud estadoSolicitud = entityManager.find(EstadoSolicitud.class, new Integer(3));
			solicitud.setEstadoSolicitud(estadoSolicitud);
			entityManager.remove(solicitud);
			
		}catch (Exception e) {
			e.printStackTrace();
			throw new EJBException(e);
		}
	}
	
	public Solicitud findSolicitudById(Integer solicitudID) throws EJBException{
		try{
			logger.info("find solicitud");
			return entityManager.find(Solicitud.class, solicitudID);
		}
		catch(EJBException ej)
		{
			ej.getCause();
			ej.printStackTrace();
			
		}
		catch(Exception e){
			e.printStackTrace();
			logger.info("fallo metodo: finSolicitudbyId");
		}
		
		return null;
	}
	
	@SuppressWarnings("unchecked")
	public List<Integer> findAllSolicitudesPendientes() throws EJBException {
		try{
			String queryString = 	"SELECT solicitud.solicitudId " +
									"FROM Solicitud solicitud " +
									"WHERE solicitud.estadoSolicitud.estadoSolicitudId =1";
			Query query = entityManager.createQuery(queryString);
			return query.getResultList();
		}
		catch(RuntimeException r)
		{
			r.printStackTrace();
		}
		catch (Exception e) {
			e.printStackTrace();
			logger.info("fallo metodo: findAllSolicitudesPendientes");
		}
		return null;
	}
	
	
	/**
	 * METODOS PRIVADOS
	 */
}

